import { ElMessage } from 'element-plus'
import { certificateApi } from '@/api/certificateApi'

/**
 * 二维码处理相关的组合式函数
 * @returns {Object} 二维码相关的方法
 */
export function useQRCode() {
  /**
   * 获取证书编号
   * @param {Array} fields - 证书字段列表
   * @returns {string} 证书编号
   */
  const getCertNumber = (fields) => {
    const certNumberField = fields.find(f => f.field_name === 'cert_number')
    return certNumberField ? certNumberField.description : ''
  }

  /**
   * 获取项目名称
   * @param {Array} fields - 证书字段列表
   * @returns {string} 项目名称
   */
  const getProjectName = (fields) => {
    // 查找项目名称字段，可能标记为project_name或者字段名为"项目名称"
    const projectField = fields?.find(f => 
      f.field_name === 'project_name' || 
      f.name === '项目名称')
    return projectField ? projectField.description : '-'
  }

  /**
   * 获取委托单位
   * @param {Array} fields - 证书字段列表
   * @returns {string} 委托单位
   */
  const getClientName = (fields) => {
    // 查找委托单位字段，可能标记为client_name或者字段名为"委托单位"
    const clientField = fields?.find(f => 
      f.field_name === 'client_name' || 
      f.name === '委托单位')
    return clientField ? clientField.description : '-'
  }

  /**
   * 获取样品名称
   * @param {Array} fields - 证书字段列表
   * @returns {string} 样品名称
   */
  const getSampleName = (fields) => {
    // 查找样品名称字段，可能标记为sample_name或者字段名为"样品名称"
    const sampleField = fields?.find(f => 
      f.field_name === 'sample_name' || 
      f.name === '样品名称')
    return sampleField ? sampleField.description : '-'
  }

  /**
 * 下载证书二维码
 * @param {Object} cert - 证书对象
 */
const handleDownload = async (cert) => {
  try {
    // 检查是否有证书ID
    if (!cert.id) {
      throw new Error('下载失败：证书ID不存在')
    }
    
    // 获取证书编号作为文件名
    const certNumber = getCertNumber(cert.fields)
    if (!certNumber) {
      throw new Error('下载失败：无法获取证书编号')
    }
    
    // 直接使用二维码URL下载
    const baseUrl = window.location.origin
    const qrUrl = `${baseUrl}/api/certificates/${cert.id}/qrcode?t=${new Date().getTime()}`
    
    // 创建下载链接
    const link = document.createElement('a')
    link.href = qrUrl
    link.download = `${certNumber}_qrcode.png`
    link.target = '_blank'
    
    // 触发下载
    document.body.appendChild(link)
    link.click()
    
    // 延迟清理，确保下载已开始
    setTimeout(() => {
      document.body.removeChild(link)
    }, 100)
    
    ElMessage.success('下载已开始')
  } catch (error) {
    console.error('下载二维码失败:', error)
    ElMessage.error(error.message || '下载二维码失败')
  }
}

  /**
   * 处理二维码加载错误
   * @param {Object} cert - 证书对象
   */
  const handleQRCodeError = async (cert) => {
    try {
      // 最多重试3次
      let retryCount = 0
      const maxRetries = 3
      let success = false

      while (!success && retryCount < maxRetries) {
        try {
          // 清空当前的二维码URL，显示占位图
          cert.qr_code_url = ''
          
          const response = await certificateApi.regenerateQRCode(cert.id)
          if (response.code === 200) {
            // 添加时间戳避免浏览器缓存
            cert.qr_code_url = `${response.data.qr_code_url}?t=${new Date().getTime()}`
            success = true
            
            // 只在用户主动操作时显示成功消息
            if (cert.showSuccessMessage) {
              ElMessage.success('二维码重新生成成功')
              cert.showSuccessMessage = false
            }
          } else {
            throw new Error(response.message || '二维码重新生成失败')
          }
        } catch (retryError) {
          retryCount++
          if (retryCount === maxRetries) {
            throw retryError
          }
          // 等待一段时间后重试
          await new Promise(resolve => setTimeout(resolve, 1000))
        }
      }
    } catch (error) {
      console.error('重新生成二维码失败:', error)
      // 只在用户主动操作时显示错误消息
      if (cert.showSuccessMessage) {
        ElMessage.error('二维码重新生成失败，请刷新页面重试')
        cert.showSuccessMessage = false
      }
    }
  }

  /**
   * 批量下载二维码
   * @param {Array} certificates - 证书列表
   */
  const handleBatchDownload = async (certificates) => {
    try {
      const selectedCerts = certificates.filter(cert => cert.qr_code_path)
      if (selectedCerts.length === 0) {
        ElMessage.warning('没有可下载的二维码')
        return
      }
      
      const response = await certificateApi.batchDownloadQRCode(
        selectedCerts.map(cert => cert.id)
      )
      
      // 获取文件名
      const fileName = `qrcodes_${new Date().getTime()}.zip`
      
      // 创建下载链接
      const url = window.URL.createObjectURL(
        new Blob([response], { type: 'application/zip' })
      )
      const link = document.createElement('a')
      link.href = url
      link.download = fileName
      
      // 触发下载
      document.body.appendChild(link)
      link.click()
      
      // 延迟清理，确保下载已开始
      setTimeout(() => {
        document.body.removeChild(link)
        window.URL.revokeObjectURL(url)
      }, 100)
      
      ElMessage.success('批量下载已开始')
    } catch (error) {
      console.error('批量下载二维码失败:', error)
      ElMessage.error(error.message || '批量下载失败')
    }
  }

  return {
    handleDownload,
    handleQRCodeError,
    handleBatchDownload,
    getCertNumber,
    getProjectName,
    getClientName,
    getSampleName
  }
} 